package com.syf.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

@Configuration
//通过@EnableConfigurationProperties对IdProperties进行实例化时，便会使用到@ConfigurationProperties的功能，对属性进行匹配赋值。
@EnableConfigurationProperties(IdProperties.class)
public class IdAutoConfiguration {

    private static IdProperties  idProperties;

    /**
     * 发请求的工具(不是redis):
     *      apache的HTTPClient类，逻辑繁琐，代码复杂，还要自己编写使用类HttpClientUtil，封装对应的post，get，delete等方法。
     *      RestTemple是Spring提供的用于访问Http请求的客户端，RestTemple提供了多种简洁的远程访问服务的方法，省去了很多无用的代码
     *      RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制，用来把对象封装到HTTP请求体，将响应信息放到一个对象中
     */
    private static RestTemplate restTemplate = new RestTemplate() ;

    public IdAutoConfiguration(IdProperties idProperties){
        IdAutoConfiguration.idProperties = idProperties ;
    }

    /**
     * 用户 身份证信息的实名认证
     * @param realName
     * 用户的真实信息
     * @param cardNum
     * 用户的身份证号
     * @return
     * 验证的结果
     */
    public static boolean check(String realName ,String cardNum){

        /**
         * 本次请求我们是AppCode的形式验证:    Authorization:APPCODE 你自己的AppCode
         *  请求头中添加: Authorization:APPCODE 你自己的AppCode
         */
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Authorization","APPCODE "+idProperties.getAppCode());

        //发送请求 阿里云身份认证服务器 验证身份证
        ResponseEntity<String> responseEntity = restTemplate.exchange( //字符类型和整数类型的格式化
                // %s 是变量: str=String.format("Hi,%s %s %s", "小超","是个","大帅哥");  ->  Hi,小超 是个 大帅哥
                String.format(idProperties.getUrl(), cardNum, realName), //请求的URL和参数：https://idcert.market.alicloudapi.com/idcard?idCard=%s&name=%s
                HttpMethod.GET,
                new HttpEntity<>(null, httpHeaders), //请求头设置
                String.class  //返回值类型
        );

        // https://market.aliyun.com/products/57000002/cmapi022049.html?spm=5176.2020520132.101.2.2fe57218VVSjB0#sku=yuncode1604900000
        if(responseEntity.getStatusCode()== HttpStatus.OK){
            String body = responseEntity.getBody();
            JSONObject jsonObject = JSON.parseObject(body);
            String status = jsonObject.getString("status");
            if("01".equals(status)){ // 身份证 验证成功
                return true ;
            }
        }
        return  false ;
    }
}
